#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Time    : 2020/7/8 11:37
# @Author  : JY.Liu
# @Site    : http://github.com/lh1993
# @Mail    : lhln0119@163.com
# @File    : my_redis.py
# @Software: PyCharm

import redis
from tools import get_config


class Redis(object):
    """自定义redis类

    """
    def __init__(self):
        self.pool = redis.ConnectionPool(
            host=get_config.redis_host,
            port=get_config.redis_port,
            db=get_config.redis_db)
        self.r = redis.StrictRedis(connection_pool=self.pool)

    # 待修改
    def __setitem__(self, k, v):
        self.k = v

    def convert(self, data):
        if isinstance(data, bytes):
            return data.decode('utf-8')
        if isinstance(data, dict):
            return dict(map(self.convert, data.items()))
        if isinstance(data, tuple):
            return map(self.convert, data)
        if isinstance(data, list):
            return list(map(self.convert, data))
        return data

    def delete(self, key):
        """字符串类型，删除指定的key, 成功返回1，失败返回0

        :param key: key名称
        :return: int， 1 or 0
        """
        return self.r.delete(key)

    def set(self, key, value):
        """字符串类型，创建key

        :param key: key名称
        :param value: key对应的值
        :return: bool
        """
        return self.r.set(key, value)

    def get(self, key):
        """字符串类型，取指定key的内容

        :param key: key名称
        :return: str
        """
        value = self.r.get(key)
        if value:
            return value.decode("utf-8")
        else:
            return None

    def keys(self):
        """字符串类型，获取所有的key名称

        :return: list
        """
        keys = self.r.keys()
        return self.convert(keys)

    def exists(self, key):
        """字符串类型，判断key是否存在，存在返回1，不存在返回0

        :param key: key名称
        :return: int，1 or 0
        """
        return self.r.exists(key)

    def expire(self, key, time):
        """字符串类型，设置过期时间，如30秒后过期

        :param key: 设置过期时间的key名称
        :param time: 过期时间，单位秒
        :return: bool
        """
        return self.r.expire(key, time)

    def expireat(self, key, timestamp):
        """字符串类型，设置指定的过期时间，如2020-07-09 12:00:00过期

        :param key: 设置过期时间的key名称
        :param timestamp: 设置指定过期时间的秒数时间戳
        :return: bool
        """
        return self.r.expireat(key, timestamp)
    
    def incr(self, key):
        """字符串类型，key值加1

        :param key:
        :return:
        """
        return self.r.incr(key)

    def decr(self, key):
        """字符串类型，key值减1

        :param key:
        :return:
        """
        return self.r.decr(key)

    def hmset(self, key, mapping):
        """hash类型，增加记录

        :param key: key名称
        :param mapping: mapping dict，如{'name1':'aa','name2':'bb'}
        :return: bool
        """
        return self.r.hmset(key, mapping)

    def hgetall(self, key):
        """hash类型，查询指定key的所有字段及值

        :param key: key名称
        :return: dict
        """
        hkey = self.r.hgetall(key)
        return self.convert(hkey)

    def hdel(self, key):
        """hash类型，删除指定的key的所有字段

        :param key:
        :return: int，删除key对应字段的数量
        """
        all_keys = list(self.hgetall(key).keys())
        if all_keys:
            return self.r.hdel(key, *all_keys)
        else:
            return None
